package cnsatmsmart.automation.mmi.view.layers;

import com.bbn.openmap.Layer;
import com.bbn.openmap.event.ProjectionEvent;
import com.bbn.openmap.omGraphics.OMGraphicList;
import com.bbn.openmap.proj.Projection;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Iterator;
import java.util.List;

import cnsatmsmart.automation.mmi.model.data.TSafe.Fix;
import cnsatmsmart.automation.mmi.model.layers.OMLabelRectangle;

/**
 * @author SIK - PTIK, BPPT
 **/

public class AirportsLayer extends Layer {
    /* const */
        private static final int AIRPORTS_SIZE = 10;
            //nilai default untuk ukuran airport pada penggambaran fix yang merupakan instance dari kelas AirportsLayer

        private static final Color FIXES_COLOR = new Color (192, 192, 192);
            //nilai warna default untuk pewarnaan pada penggambaran airports yang merupakan instance dari kelas AirportsLayer

    /* atribut - atribut yang dimiliki oleh kelas AirportsLayer */
        private OMGraphicList graphics = new OMGraphicList();
        private Projection projection = null;

        private List < Fix > airports = null;

        boolean isCreated = false;
    
    /* constructor - user defined ctor, no default ctor */
        // <editor-fold defaultstate="collapsed" desc="ctor">
        /**
         * menginstansiasi object AirportsLayer<br />
         * #do nothing ctor
         */
        public AirportsLayer() { }
        // </editor-fold>

    /* setter */
        /**
         * mengupdate graphics dari layer tanpa melakukan retrieve basis data jika sudah pernah dilakukan sebelumnya
         * @param graphics OMGraphicList yang merupakan container untuk menampung graphic yang akan diproyeksikan ke layar
         * @return OMGraphicList yang mengacu kepada graphics
         */
        public OMGraphicList setAirports(OMGraphicList graphics) {
            return (setAirports(graphics, false));
        }
        /**
         * mengupdate graphics dari layer
         * @param graphics OMGraphicList yang merupakan container untuk menampung graphic yang akan diproyeksikan ke layar
         * @param updateAirports boolean yang menentukan apakah pengupdatean tampilan didahului dengan proses retrieve basis data sebelumnya atau tidak :<br />
         *                       bernilai true jika melakukan retrieve basis data dan false jika sebaliknya
         * @return OMGraphicList yang mengacu kepada graphics
         */
        public OMGraphicList setAirports(OMGraphicList graphics, boolean updateAirports) {
            graphics.clear();

            if ((this.airports == null) || (updateAirports)) {
                this.airports = FixesLayer.getAirports();
            }

            if (this.airports != null) {
                Iterator < Fix > airportsIter = this.airports.iterator();
                while (airportsIter.hasNext()) {
                    Fix airport = airportsIter.next();
                    OMLabelRectangle point = new OMLabelRectangle((float)airport.getLatitude(), (float)airport.getLongitude(), AIRPORTS_SIZE, airport.getID());
                    point.setLinePaint(FIXES_COLOR);
                    graphics.addOMGraphic(point);
                }
            }

            isCreated = true;

            return (graphics);
        }

    /* method - method yang dimiliki oleh kelas AirportsLayer */
        /**
         * mengupdate layer sesuai dengan data yang terdapat pada basis data
         */
        public void update() {
            setAirports(this.graphics, true);
            this.graphics.project(this.projection, true);
            repaint();
        }

    /**
     * event handler untuk event perubahan projection
     * @param pe ProjectionEvent event projection yang terjadi
     */
    public void projectionChanged(ProjectionEvent pe) {
        this.projection = (Projection) pe.getProjection().makeClone();
        if (! isCreated) {
            setAirports(this.graphics);
        }
        this.graphics.project(this.projection, true);
        repaint();
    }

    @Override
    public void paint (Graphics g) {
        this.graphics.render(g);
    }
}
